#ifndef TIPOSTRUCT_H_
#define TIPOSTRUCT_H_

#include "tipo_dato_compuesto.h"

/*****************************************************************
 *	tipo_struct.h
 * 
 *  Descripcion: Clase que representa una estructura de otros tipos
 *  de datos atomicos.
 *  Hereda de tipoDatoCompuesto e implementa sus metodos.
 * **************************************************************/

class TipoStruct : public TipoDatoCompuesto {
	
	public:
	
		/*
		 * Constructor default: Crea un struct vacio.
		 */
		TipoStruct(bool obligatorio);
		
		/*
		 * Destructor: Libera la mem consumida por el struct.
		 */
		virtual ~TipoStruct();
		
		//Metodos:
		
		/*
		 * Mismo tipo: Devuelve true si los 2 datos son del mismo tipo,
		 * false en caso contrario.
		 */
		 virtual bool mismo_tipo(const TipoDato& dato) const;
		 
		/* 
		 * Op de insercion: Permite asignar un valor al objeto del tipodato.
		 * Verifica que el dato pasado por param sea una estructura igual a la actual.
		 * Si hay problemas con el casteo tira una excep.
		 */
		virtual TipoDato& operator= (const TipoDato& dato) throw (ExcepErrorTipos);
		
		/*
		 * Op de igualacion: Devuelve true si los valores de los datos son
		 * iguales, false en caso contrario.
		 * Verifica que el dato pasado por param sea una estructura igual a la actual.
		 * Si hay problemas con el casteo tira una excep.
		 */
		virtual bool operator== (const TipoDato& dato) const throw (ExcepErrorTipos);
		
		/*
		 * Op <: Devuelve true si el valor del dato actual es menor al del
		 * pasado por param, false en caso contrario.
		 * Verifica que el dato pasado por param sea una estructura igual a la actual.
		 * Si hay problemas con el casteo tira una excep.
		 */
		virtual bool operator< (const TipoDato& dato) const throw (ExcepErrorTipos);
	
		/*
		 * Get Codigo Tipo: Devuelve el codigo del tipo de dato en cuestion.
		 */
		virtual CodTipo get_codigo_tipo() const;
		
		/*
		 * Add Dato: Agrega el dato pasado como param, como campo de la estructura
		 * Devuelve true si lo pudo agregar, false en caso contrario.
		 */
		virtual bool add_dato(const TipoDato& dato);
		 
		 /*
		  * Quitar Dato: Permite quitar el campo ubicado la pos pasada como param
		  * dentro de la estructura.
		  * Devuelve true si lo pudo quitar, false en caso contrario.
		  */
		 virtual bool quitar_dato(unsigned int ind);
		  
		  /*
		   * Operador []: Devuelve el dato que se encuentra en la pos
		   * determinada por el indice pasado como param.
		   * Si el indice cae fuera del tamanio de la estructura,
		   * arroja una excepcion.
		   */
		  virtual TipoDato& operator[] (size_t indice) throw (ExcepIndiceDesbordado);
		
		/*
		 * Clonar: Devuelve la referencia a un nuevo dato con el mismo 
		 * contenido que el actual.
		 * El nuevo objeto es creado en heap y debe ser liberado.
		 */
		virtual TipoDato* clonar() const;
		
		/*
		 * get_tamanio: Devuelve la cantidad de campos de la estructura.
		 */
		virtual unsigned int get_tamanio() const;
		
		/*
		 * ToStream: Dado un stream de salida, pasa la representacion del dato
		 * al mismo.
		 */
		virtual ostream& toStream(ostream& out) const;
		
		/*
		 * Crea una cadena que contiene el dato serializado. La devuelve
		 * en retorno y asigna el tamano de la misma en tam
		 */ 
		virtual void serializar(char ** retorno, unsigned int &tam);
		
		/*
		 * Obtiene un tipo de dato a partir de los datos serializados.
		 * Debe recibir el tamano de tamano de la cadena de serializados.
		 * Devuelve true si pudo realizar bien la operacion, false en
		 * caso contrario
		 */ 
		virtual bool deserializar(char * serializados, unsigned int tam);
	
};

#endif

